package despegar.utiles;

import java.util.Date;

import org.joda.time.DateTime;
import org.joda.time.MutableInterval;

public class Fecha {
	private Date date;
	private static long MilisegundosPorDia = 60 * 60 * 24 * 1000;
	
	// Si no le pasamos ning�n Formato, utiliza el flexible
	public Fecha(String fecha) {
		FormatoFechaFlexible formato=new FormatoFechaFlexible();
		this.setDate(formato.convertir(fecha));
	}
	
	public Fecha(String fecha, FormatoFecha formato) {
		this.setDate(formato.convertir(fecha));
	}
		
	public int diasHasta(Fecha otraFecha) {
		long diferencia = Math.abs(this.getDate().getTime() - otraFecha.getDate().getTime());
		return (int) (diferencia / MilisegundosPorDia);		
	}
	
	public Boolean esMayorQue(Fecha otraFecha) {
		return this.getDate().compareTo(otraFecha.getDate()) > 0;	
	}
	
	public Date getDate() {
		return this.date;
	}
	
	@SuppressWarnings("deprecation")
	public int getDia() {
		return this.getDate().getDate();
	}
	
	@SuppressWarnings("deprecation")
	public int getMes() {
		return this.getDate().getMonth() + 1;
	}
	
	@SuppressWarnings("deprecation")
	public int getAnio() {
		return this.getDate().getYear() + 1900;
	}
	
	public boolean equals(Fecha otraFecha) {
		return this.getDate().equals(otraFecha.getDate());
	}
	
	private void setDate(Date date) {
		this.date = date;
	}
	
	/**
	 * Le agrego un par de m�todos a la API para obtener representaciones en Strings
	 * de la fecha.
	 */
	public String asString(FormatoFecha formato) {
		return formato.formatear(this);
	}
	
	public String asString(String nombreDelFormato) {
		return this.asString(FormatoFechaFlexible.getFormato(nombreDelFormato));
	}

	@SuppressWarnings("deprecation")
	public Fecha plus(String horaLlegada) {
		String[] chunks = horaLlegada.split(":");
		this.getDate().setHours(Integer.parseInt(chunks[0]));
		this.getDate().setMinutes(Integer.parseInt(chunks[1]));
		return this;
	}

	public double diferenciaCon(Fecha otraFecha) {
		MutableInterval intervalo;
		if(this.esMayorQue(otraFecha)) {
			intervalo = new MutableInterval(new DateTime(otraFecha.getDate()), new DateTime(this.getDate()));
		}
		else {
			intervalo = new MutableInterval(new DateTime(this.getDate()), new DateTime(otraFecha.getDate()));
		}
		return intervalo.toDuration().getStandardMinutes();
	}
}